#include <iostream>
using namespace std;

//非类型模板参数只能是整形常量
// template<class T,size_t N = 30>
// class stack
// {
// public:
//     void func()
//     {
//         cout << N << endl;
//     }
// private:
//     T _a[N];
//     int _top;
// };


// int main()
// {
//     stack<int> s1;
//     s1.func();

//     stack<int,60> s2;
//     s2.func();

//     return 0;
// }

#include <array>
#include <vector>
#include <forward_list>

// int main()
// {
//     // array<int ,20> a1;

//     // cout << sizeof(a1) << endl;
//     // vector<int> v1(5);
//     // v1.push_back(1);
//     // cout << v1.size() << endl;
//     // forward_list<int> l1;
    
//     return 0;
// }

//模板的特化
// class Date
// {
// public:
//     Date(int year,int month,int day)
//     :_year(year),_month(month),_day(day){}

//     bool operator<(Date& d)
//     {
//         if(_year < d._year)
//         {
//             return true;
//         }
//         else if(_year == d._year && _month < d._month)
//         {
//             return true;
//         }
//         else if(_year == d._year && _month == d._month && _day < d._day)
//         {
//             return true;
//         }

//         return false;
//     }
// private:
//     int _year;
//     int _month;
//     int _day;
// };



// //函数模板的特化
// template <class T>
// bool Less(T left, T right)
// {
//     return left < right;
// }

//上面是函数模板的特化
// template <>
// bool Less<Date*>(Date* left, Date* right)
// {
//     return *left < *right;
// }

// int main()
// {
//     cout << Less(1,3) << endl;
//     Date d1(2023,11,12);
//     Date d2(2023,11,13);
//     cout << Less(d1,d2) << endl;

//     return 0;
// }

// template<class T1,class T2>
// class Data
// {
// public:
//     Data(T1 t1 = T1(),T2 t2 = T2())
//     :_t1(t1),_t2(t2)
//     {
//         cout << "Data<T1,T2>" << endl;
//     }
// private:
//     T1 _t1;
//     T2 _t2;
// };

// //全特化
// template<>
// class Data<int ,char>
// {
// public:
//     Data(int t1 = int(),char t2 = char())
//     :_t1(t1),_t2(t2)
//     {
//         cout << "Data<int ,char>" << endl;
//     }
// private:
//     int _t1;
//     char _t2;
// };

// //偏特化
// template<class T1>
// class Data<int ,T1>
// {
// public:
//     Data(int t1 = int(),T1 t2 = char())
//     :_t1(t1),_t2(t2)
//     {
//         cout << "Data<int , T1>" << endl;
//     }
// private:
//     int _t1;
//     T1 _t2;
// };

// //对参数进行限制，这里限制为指针
// template<class T1,class T2>
// class Data<T1*,T2*>
// {
// public:
//     Data(T1 t1 = T1(),T2 t2 = T2())
//     :_t1(t1),_t2(t2)
//     {
//         cout << "Data<T1*,T2*>" << endl;
//     }
// private:
//     T1 _t1;
//     T2 _t2;
// };

// template<class T1,class T2>
// class Data<T1&,T2&>
// {
// public:
//     Data(T1 t1 = T1(),T2 t2 = T2())
//     :_t1(t1),_t2(t2)
//     {
//         cout << "Data<T1&,T2&>" << endl;
//     }
// private:
//     T1 _t1;
//     T2 _t2;
// };


// //匹配逻辑：全特化->偏特化->原模版
// int main()
// {
//     Data<int,int> d1;
//     Data<int,char> d2;
//     Data<int,double> d3;

//     Data<int*,char*> d4;
//     Data<int&,int&> d5;
//     return 0;
// }

